<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 

<html>
	<head>
		<script>
		//Dimension de las matrices
		var N = 4;
		var M = 4;
		var pila = new Array();
		var matrizid = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]];
		
				
		/*
		 * Recibe una matriz de dimension N*N, e imprime la 
		 * matriz en el documento html 
		 */		
		function imprimirMatrix(A){
			//i representa las filas
			for(i=0;i<N;i++){
				//k representa un indice en cada fila i
				for(k=0;k<N;k++){
					document.write(A[i][k]+",");				
				}
				document.write("<br/ >");				
			}		
		}
		
		
		/*crear matriz
		*recibe filas y columnas y retorna una matriz vacia
		*
		*/
		function crearMatriz(irow,icol){
			var a = new Array(irow);
			for(i=0;i<irow;i++){
				a[i]=new Array(icol);
				for(j=0;j<icol;j++){
				
					a[i][j] = 0;
					
				}							
			}	
			return (a);		
		}
		
		/*iniciar la pila con la matriz identidad
		*no recibe nada, se crea la variable pila como array
		*y se pone en la base de la pila la matriz identidad.
		*/
		function poner(){
			pila.push(matrizid);	
			
		}
		
		/*copia de la pila
		*sacarle copia a la matriz de la cima de la pila
		*
		*/
		function lgPush(){
			var matrizuno = pila.pop();//saco la matriz de la pila
			var matrizdos = new Array();//creo el nuevo array para la matriz dos copia
			for(i=0;i<N;i++){
				matrizdos[i]=new Array();
				for(j=0;j<N;j++){
				
					matrizdos[i][j] = matrizuno[i][j];
					
				}							
			}
			pila.push(matrizuno);
			pila.push(matrizdos);	
			
		}
		
		/*sacar de la pila
		*saca de la pila la matriz que se encuentra en la cima de la pila
		*
		*/
		function lgPop(){
			return pila.pop();
		}
		
		
		/*
		 * A y B son matrices de dimensión NxN, retorna como resultado
		 * otra matriz resultado de la multiplicación de las matrices A y B.
		 */
		function multMatrix(A,B) {
			var c = crearMatriz(N,N);
			for(i=0;i<N;i++){
				for(j=0;j<M;j++){
					c[i][j]=0;
					for(k=0;k<M;k++){
					
						c[i][j] +=  A[i][k] * B[k][j];	
										
					}
					
				}
			}			
			return (c);
											
		}
		
		
		/*multiplicacion de una matriz por un punto
		*recibe un punto y una matriz, y retorna como resultado
		*un punto
		*/
		function matrizPunto(A,p){
			var pto =  new Array(N);
			for(var i=0;i<N;i++){
				pto[i] = 0;
				for(var k=0;k<N;k++){
					
					pto[i] +=  A[i][k] * p[k];	
										
				}
			}			
			return (pto);
		
		}
		/*funcion que recibe una matriz y la multiplica por 
		*la matriz de la cima de la pila, entregando como 
		*resultado otra matriz que sera puesta en la cima de la pila
		*/
		function transformacion(D){
			var matrizA=pila.pop();
			var ans =  new Array();
			var ans = multMatrix(matrizA,D);
			pila.push(ans);
		}
		
		/*Funcion que recibe un punto y lo multiplica
		*por la matriz de la cima de la pila, y retorna un nuevo
		*punto 
		*/
		/**function transformaPunto(P){
		
			
		}**/
				
		function prueba() {
			var matriz1=[[1,2,3,4],[2,1,4,5],[3,5,8,7],[3,2,1,4]];
			//var matriz2=[[1,2,3,4],[2,1,4,5],[3,5,8,7],[3,2,1,4]];
			var punto = [1,2,1,2];
		//	resultado = multMatrix(matriz1,matriz2);
			var resultado = matrizPunto(matriz1,punto);
			alert("el resultado es:" + resultado);
			//var matriz = [[1,2,3,4],[2,1,4,5],[3,5,8,7],[3,2,1,4]];
			//imprimirMatrix(matriz);
			
		}
		
		/*funcion prueba para la parte de la pila.
		*
		*
		*/
		function pruebauno() {
         	var matriztres = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]];
            poner();
            pila.push(matriztres);
            lgPush();
            pila[pila.length-1][1][1]=5;
            imprimirMatrix(pila.pop());
            imprimirMatrix(pila.pop());
            imprimirMatrix(pila.pop());
         }
         
         
        function pruebados(){
        	var mat = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]];
        	poner();
        	pila.push(mat);
        	var resultado = transformacion(mat);
        	imprimirMatrix(pila.pop());
        
        }
         
         
         	
		</script>
		<body>
			<input type="button" onclick="prueba()" value="Prueba" />
			<input type="button" onclick="pruebauno()" value="Pruebauno" />
			<input type="button" onclick="pruebados()" value="Pruebados" />
			
		</body>
		
	</head>
</html>


